using System;
using System.Collections.Generic;
using NHibernate.Criterion;
using EntitiesAndMappings.Entities;
using NHibernate.SqlCommand;
using NHibernate;

namespace ProyectoActivos.Daos
{
    public class ArticuloDAO : BaseDAO<Articulo>
    {

        public IList<Articulo> Buscar(Articulo articulo)
        {
            IList<Articulo> lista;
            using (var session = CreateSessionFactory().OpenSession())
            {
                using (var transaction = session.BeginTransaction())
                {
                    var criteria = session.CreateCriteria<Articulo>();

                    criteria.CreateAlias("Marca", "Marca", JoinType.InnerJoin);
                   
                    //condic marca modelo


                    if (articulo.Codigo.CompareTo(String.Empty) != 0)
                    {
                        // criteria.Add(Expression.InsensitiveLike("Codigo", articulo.Codigo,MatchMode.Start));
                        criteria.Add(Restrictions.Like("Codigo", articulo.Codigo + "%"));
                    }

                    if (articulo.Descripcion.CompareTo(String.Empty) != 0)
                    {
                        //  criteria.Add(Expression.InsensitiveLike("Descripcion", articulo.Descripcion,MatchMode.Start));
                        criteria.Add(Restrictions.Like("Descripcion", articulo.Descripcion + "%"));
                    }

                    lista = criteria.List<Articulo>();
                    transaction.Commit();
                }

            }
            return lista;
        }

        public IList<Articulo> BuscarEnConsulta(Articulo articulo)
        {
            IList<Articulo> lista;
            using (var session = CreateSessionFactory().OpenSession())
            {
                using (var transaction = session.BeginTransaction())
                {
                    var criteria = session.CreateCriteria<Articulo>();
                    criteria.CreateCriteria("SubFamilia", "SubFamilia", JoinType.InnerJoin).CreateAlias("Familia", "Familia", JoinType.InnerJoin);
                    criteria.CreateAlias("TipoMantenimiento", "TipoMantenimiento", JoinType.InnerJoin);
                    criteria.CreateAlias("Marca", "Marca", JoinType.InnerJoin);
                    if (articulo.SubFamilia != null)
                    {
                        criteria.Add(Restrictions.Eq("SubFamilia.Id", articulo.SubFamilia.Id));
                    }

                    if (articulo.TipoMantenimiento != null)
                    {
                        criteria.Add(Restrictions.Eq("TipoMantenimiento.Id", articulo.TipoMantenimiento.Id));
                    }

                    if (articulo.Marca != null)
                    {
                        criteria.Add(Restrictions.Eq("Marca.Id", articulo.Marca.Id));
                    }
                   
                    lista = criteria.List<Articulo>();
                    transaction.Commit();
                }

            }
            return lista;
        }


        public int BuscarIdPorArticulo(String codigoArticulo)
        {
            Articulo articulo;
            using (var session = CreateSessionFactory().OpenSession())
            {
                using (var transaction = session.BeginTransaction())
                {
                    var criteria = session.CreateCriteria<Articulo>();
                    criteria.Add(Restrictions.Eq("Codigo", codigoArticulo));
                    articulo = criteria.UniqueResult<Articulo>();
                    transaction.Commit();
                }
            }
            return articulo.Id;
        }

    }
}